# 凸包
# 在二维：凸包是能包围所有点的最小凸多边形
# 在三维：凸包是能包围所有点的最小凸多面体
# 快速凸包算法 https://zhuanlan.zhihu.com/p/166105080

import open3d as o3d

# 加载兔子网格数据
# 网格数据
bunny = o3d.data.BunnyMesh()
# 读取三角网格 
# 三角网格 https://zhuanlan.zhihu.com/p/628744086
mesh = o3d.io.read_triangle_mesh(bunny.path)

# 先来看看这样显示出来的是什么东西
# o3d.visualization.draw_geometries([mesh])
# 显示出来是个灰色的兔子
# 计算顶点法向量确定光反射的方向，给它加上肌理

# 计算顶点法向量
mesh.compute_vertex_normals()
# 在显示一下
# o3d.visualization.draw_geometries([mesh])

# 通过泊松圆盘采样的方式获取点云数据 https://www.zhihu.com/question/276554643/answer/1039095847
pcl = mesh.sample_points_poisson_disk(number_of_points=1000)
# print(pcl.points)

# 用QHull算法计算凸包 
# 返回值：hull表示凸包的三角网格，_辅助信息，此处用_省略
hull, _ = pcl.compute_convex_hull()
# 不省略的话，可以这样写
# hull, convex_aux_info = pcl.compute_convex_hull()

# 把凸包转成线集，显示轮廓
hull_ls = o3d.geometry.LineSet.create_from_triangle_mesh(hull)

# 把线集涂成红色
hull_ls.paint_uniform_color((1, 0, 0))

o3d.visualization.draw_geometries([pcl, hull_ls])
